#include <bits/stdc++.h>
#define int long long 
using namespace std;

const int maxn1 = 55;
const int maxn2 = 1e5 + 5;
int n;
int dp[maxn1][maxn2]; // 表示在第 j 时刻买课时的最大值, 但是最后的 dp[n][m] 并不一定是最大值
                      // 因为可能 j 时刻很多课程都已经结束了

struct course{
	int a, b, c;
}cs[maxn1];

bool cmp(course c1, course c2){
	return c1.b < c2.b;
}

void solve(){
	cin >> n;
	int mx = 0;
	for (int i=1;i<=n;i++) {
		cin >> cs[i].a >> cs[i].b >> cs[i].c;
		mx = max(mx, cs[i].b);
	}
//	 注意这个背包问题与前面的不同, 前面的是, 东西就在那放着的,什么时候都能取, 不会错过, 
//	 但是这里面, 有一个时间的限制, 所以需要提前考虑先截止的, 不然会失去很多其他种情况
	sort(cs+1, cs+1+n, cmp);
	int ans = 0;
	for (int i=1;i<=n;i++) {
		for (int j=1;j<=mx;j++) {
			// 不选
			dp[i][j] = dp[i-1][j];
			// 选择
			if (j <= cs[i].b && j-cs[i].a >= 0) { // 在未截止并且有充足时间的情况下
				dp[i][j] = max(dp[i][j], dp[i-1][j-cs[i].a] + cs[i].c);
			}
			ans = max(ans, dp[i][j]);
//			cout << i << ' ' << j << ' ' << dp[i][j] << '\n';
		}
	}
	// 最后的 dp[n][m] 并不一定是最大值, 因为 dp[i][j] 表示在第 j 时刻买课时的最大值
	// 但是可能 j 时刻很多课程都已经结束了, 最佳答案可能是在中途的时候买课, 此时价值高的课程还没有结束
	cout << ans << '\n';
}

signed main(){
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	solve();
	return 0;
}
